package com.atguigu.mybatis.lamda;

import java.util.Comparator;

/**
 * Created by Smexy on 2022/11/9
 *
 *  lamda表达式是函数式编程和面向对象编程的结合。
 *          一般用来简化@FunctionalInterface类型的接口，创建匿名内部类。
 *
 *          @FunctionalInterface类型： 称为函数式接口。这种接口一般只有一个抽象方法
 *
 *  -------------------
 *      lamda表达式语法:
 *            参数列表  ->  函数体
 *              参数列表：  ( 参数类型  参数名, 参数类型  参数名)
 *                              参数类型可以省略，由JVM推导
 *                              如果参数列表只有一个参数，()可以省略
 *
 *              函数体：    {  接口中的抽象方法的实现  }
 *                              如果{}只有一行代码，那么{}可以省略。
 *                              如果{}只有一行代码，那么return也可以省略。
 *
 *    ----------------------
 *    方法引用 是 lamda表达式的特例
 */
public class LamdaDemo1
{
    public static void main(String[] args) {

        Comparator c1= new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };

        System.out.println(c1.compare(1, 2));

        System.out.println("-------------用lamda表达式简化----------");

        Comparator<Integer> c2 = ( o1,  o2) ->   o1.compareTo(o2);

        System.out.println("-------------用方法引用简化----------");

        /*
                Comparator<Integer> c2 = ( o1,  o2) ->   o1.compareTo(o2);
                     ( o1,  o2) ->   o1.compareTo(o2) 返回的是 Comparator<Integer>的一个实例。
                                这个实例，实现了compare。
                                compare的实现逻辑: Integer o1.compareTo(Integer o2)

                                Integer.compare :  public static int compare(int x, int y)

                  方法引用： 在实现一个接口的抽象方法时，我实现的逻辑和某一个方法的逻辑一样。
                            那我就不写了，不要重复造轮子，直接告诉JVM，你去找某个类型的某个方法来用就行了！
         */

        /*
                 Integer::compareTo 的逻辑:  return (x < y) ? -1 : ((x == y) ? 0 : 1)
            Comparator<Integer> c3 =  (x,y) -> (x < y) ? -1 : ((x == y) ? 0 : 1);
         */
        Comparator<Integer> c3 = Integer::compareTo;

        System.out.println(c3.compare(1, 2));

    }
}
